package com.youlai.eng.entity;

import java.io.Serializable;

import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.*;
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

/**
 * 物料清单表2(bee_eng_bill2)实体类
 *
 * @author xiamw
 * @since 2023-12-26 14:43:06
 * @description 由 Mybatisplus Code Generator 创建
 */
@Schema(description ="物料清单表2实体对象")
@Data
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "bee_eng_bill2", schema = "youlai_boot", catalog = "")
public class EngBill2Entity  implements Serializable {
    @Transient
    private static final long serialVersionUID = 1L;

    @Schema(description ="主键ID")
    @Id
    @Column(name = "eng_bill2_id", unique = true)
	private Long engBill2Id;
    /**
     * 父货号 LPK
     */
    private String parentItemNo;

    @Transient
    private String parentItemName;

    /**
     * 子类 LPK
     * 子类是一个非常重要的字段，它标识着子项以何种方式纳入父项之中。我们知道仅对产
     * 品结构来讲父项包含子项，而子项既可以是普通的原材料也可以是其他种类的材料，我们希
     * 望电脑能分别以不同的方式来处理这些子项，那么这些功能就靠子类这一字段来实现。
     * 在本系统中共定义了9个子类代码，分别如下：
     * ① C ＝ 副产品（Co-Product）。它的含义是，当在制造产品的过程中，除了我们希望得
     * 到的产品外，由于生产工艺等因素它还会产生另外一种副产品，这种副产品不是废物，它有
     * 一定的产品价值，可以用于出售或作它用，例如在冶炼铜的过程中会产生酸。用C即可定义
     * 酸这一副产品，它的功能是当用户下一张订单生产某一产品时，系统会自动在订单中加入副
     * 产品要求回收。
     * ② D ＝ 文件（Document）。指产品在制造过程中所特别需要的文件，如说明书、图纸
     * 等。这些文件通常是随产品一起包装出售的。
     * ③ N ＝ 普通物料（Normal）。指一般构成产品的直接材料，如原材料、半成品等。这
     * 些子件，将会在生产其父件时使用到，它们会出现在生产父件的领料单上。这些子件必须是
     * 库存件，如图3-13所示。
     * ④ P＝虚构件（Phantom）。这一类别主要应用在装配型的产品上，一个装配型的产品是
     * 由许多零部件组成的。往往是很多零件先组成部件，然后部件再进一步组装成成品。在这一
     * 过程中，通常都在生产线上动态完成，很难确定某一部件的静止形态，但在理解和分解产品
     * 结构时，这些部件往往又都需要标识出来。为了解决这两方面的问题，虚构件的概念就被提
     * 了出来，它首先是存在于产品结构中的一个部件，同时它在生产中仅是一个瞬间状态的过程
     * 部件，那么这个部件我们通常定义为虚构件。
     * ⑤ R＝可替换件（Replace）。在实际的生产中，有时某一原材料或零部件可以使用在很
     * 多地方，另外有些原材料或零部件没有库存时，可以用其他具有同种性能的原材料或零部件
     * 来替代。用R即可定义这一类的原材料或零部件。
     * 在本学习系统中没有提供可替换件自动替换功能。
     * ⑥ T ＝ 发出工具（Tooling）。在实际的生产中，有时为了加工某一产品而需要使用某
     * 一特殊的工具，或者需要在出售的产品中配售某一特殊的工具。对于这一特殊的工具，从仓
     * 库里出货到生产线上仅做一次性使用或包装进产品中，这些工具不需要再退回给仓库，那么
     * 这一类工具即为发出工具。
     * ⑦ U ＝ 发出返回（Return Tooling）。这一工具与前面的仅发出工具不同，这种工具在
     * 使用后仍可以回收再使用，这种类型的工具在使用完成后应该退回给仓库，以便下次再领出
     * 使用。
     * ⑧ W ＝ 工作中心（Work Center）。工作中心是指有一定产品加工能力的机器、人力、
     * 工作小组、作业部门等的总称。例如用户想单独考察某一台机的生产能力情况，用户可以定
     * 义这台机器为一个工作中心；而如果用户想连操作这台机器的人一起考察，那么用户也可以
     * 将这台机器加上操作这台机器的人一起定义成一个工作中心。
     * ⑨ X ＝ 参考（Reference）。参考仅是指普通用于参考性质的文件，它的含义类似前面
     * 的“文件”，两者间的区别仅为文件一般定义成与产品有关的说明书或图纸等，而参考通常仅
     * 指一些额外的或临时的特别说明。
     */
    private String ct;

    /**
     * 子货号 LPK (这种关联的对象 不能是逻辑删除的情况，没有删除或者物理删除才可以)
     */
    @ManyToOne(fetch=FetchType.EAGER, targetEntity=EngItemEntity.class)
    @JoinColumn(name = "item_no",   referencedColumnName="itemNo", nullable = false)
    private EngItemEntity itemNoEntity;

    @Transient
    private String itemNo;

    /**
     * 数量
     */
    private Double qty;
    /**
     * 量类
     * ① I––––按货号（By Item）。它的含义是，子项的使用量是按每一单位的父项来确定的，
     * 即一个单位的父项需要多少单位的子项。
     * ② O––––按订单（By Order）。它的含义是，子项的使用量是按每一张订单的父项来确定
     * 的，即一张订单的父项需要多少单位的子项
     */
    private String qt;

    /**
     * 损耗率
     * 在实际的生产中，当投入到工厂中100单位的原料后，由于有时原材料会有瑕疵，或者有
     * 时会在生产中损坏，这时所投入的100单位实际上没有100个单位真正可用，这个瑕疵，或者
     * 损坏量就是损耗。损耗以百分率表示。
     */
    private Double scrap;

    /**
     * 偏置期
     * 这样在生产这一产品时，这些原材料或半成品有时不用
     * 同一时间投入进去，有些原材料或半成品可以推迟几天再投入，这里的可以推迟的天数，即
     * 是这一子项的偏置期。偏置期用天表示。
     */
    private Integer offset;

    //公共属性
    @Schema(description ="排序")
    private Integer sort;

    @Schema(description ="状态(1:正常;0:禁用)")
    private Integer status=1;

    @Schema(description ="备注")
    private String remark;

    @Schema(description ="逻辑删除标识(0:未删除;1:已删除)")
    private Integer deleted=0;

    @JsonInclude(value = JsonInclude.Include.NON_NULL)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @CreatedDate
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;
    private Long createBy;
    private String createName;

    private Long updateBy;
    @JsonInclude(value = JsonInclude.Include.NON_NULL)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @LastModifiedDate
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTime;
    private String updateName;

    @Transient
    private Integer opType;

    @Transient
    private String level="1";

}